#if !defined(__xmemfile_h)
#define __xmemfile_h

#include "xfile.h"

#include <string>

//////////////////////////////////////////////////////////
class DLL_EXP CxMemFile : public CxFile
{
  public:
    CxMemFile(uint8_t* pBuffer = NULL, uint32_t size = 0);
    ~CxMemFile();

    bool     Open();
    uint8_t* GetBuffer(bool bDetachBuffer = true);

    virtual bool    Close();
    virtual size_t  Read(void* buffer, size_t size, size_t count);
    virtual size_t  Write(const void* buffer, size_t size, size_t count);
    virtual bool    Seek(int32_t offset, int32_t origin);
    virtual int32_t Tell();
    virtual int32_t Size();
    virtual bool    Flush();
    virtual bool    Eof();
    virtual int32_t Error();
    virtual bool    PutC(uint8_t c);
    virtual int32_t GetC();
    virtual char*   GetS(char* string, int32_t n);
    virtual int32_t Scanf(const char* format, void* output);

  protected:
    bool Alloc(uint32_t nBytes);
    void Free();

    uint8_t* m_pBuffer;
    uint32_t m_Size;
    bool     m_bFreeOnClose;
    int32_t  m_Position; // current position
    int32_t  m_Edge;     // buffer size
    bool     m_bEOF;
};

#endif
